package com.xiegang.internalcommon.util;


import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.*;
import com.xiegang.internalcommon.constant.CommonStatusEnum;
import com.xiegang.internalcommon.dto.TencentMes;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.time.LocalDateTime;

/**
 * @author xieGang
 * @description
 * @date 2023/3/6 13:41
 **/
public class SendSmsUtils {

    public static final String secretId = "AKID4waz93i8IFxP7ex2tWv63mHZd3QbZKsD";

    public static final String secretKey = "CBxWs1xfBVbUAdtvkMlwufDYgbGgqkPo";

    public static final String smsSdkAppId = "1400798129";

    public static final String templateId = "1721708";

    public static final String signName = "谢刚个人学习网";

    public static final String invalidTime = "2";

    public static final String region = "ap-nanjing";
    public static final String endpoint = "sms.tencentcloudapi.com";

    public static void main(String[] args) {
        sendSms("15674647242", "121212");
    }

    public static TencentMes sendSms(String phone, String verificationCode) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential(secretId, secretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint(endpoint);
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            SmsClient client = new SmsClient(cred, region, clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SendSmsRequest req = new SendSmsRequest();
            String[] phoneNumberSet1 = {phone};
            req.setPhoneNumberSet(phoneNumberSet1);

            req.setSmsSdkAppId(smsSdkAppId);
            req.setSignName(signName);
            req.setTemplateId(templateId);

            String[] templateParamSet1 = {verificationCode, invalidTime};
            req.setTemplateParamSet(templateParamSet1);

            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);

            return getTencentMes(resp);
        } catch (TencentCloudSDKException e) {
            TencentMes tencentMes = new TencentMes();
            tencentMes.setCode(String.valueOf(CommonStatusEnum.FAIL.getCode()));
            tencentMes.setMessage(e.toString());
            LocalDateTime now = LocalDateTime.now();
            tencentMes.setGmtCreate(now);
            tencentMes.setGmtModified(now);
            return tencentMes;
        }
    }

    private static TencentMes getTencentMes(SendSmsResponse resp) {
        if (resp == null) {
            return null;
        }
        // 输出json格式的字符串回包
        JSONObject jsonObject = JSONObject.fromObject(SendSmsResponse.toJsonString(resp));
        JSONArray sendStatusSet = (JSONArray) jsonObject.get("SendStatusSet");
        JSONObject SendStatus = JSONObject.fromObject(sendStatusSet.get(0));

        TencentMes tencentMes = new TencentMes();
        tencentMes.setCode(SendStatus.get("Code") == null ? "" : String.valueOf(SendStatus.get("Code")));
        tencentMes.setFee(SendStatus.get("Fee") == null ? "" : String.valueOf(SendStatus.get("Fee")));
        tencentMes.setIsoCode(SendStatus.get("IsoCode") == null ? "" : String.valueOf(SendStatus.get("IsoCode")));
        tencentMes.setMessage(SendStatus.get("Message") == null ? "" : String.valueOf(SendStatus.get("Message")));
        tencentMes.setPhoneNumber(SendStatus.get("PhoneNumber") == null ? "" : String.valueOf(SendStatus.get("PhoneNumber")));
        tencentMes.setSerialNo(SendStatus.get("SerialNo") == null ? "" : String.valueOf(SendStatus.get("SerialNo")));
        tencentMes.setSessionContext(SendStatus.get("SessionContext") == null ? "" : String.valueOf(SendStatus.get("SessionContext")));
        tencentMes.setRequestId(jsonObject.get("RequestId") == null ? "" : String.valueOf(jsonObject.get("RequestId")));

        LocalDateTime now = LocalDateTime.now();
        tencentMes.setGmtCreate(now);
        tencentMes.setGmtModified(now);
        return tencentMes;
    }
}
